home *** CD-ROM | disk | FTP | other *** search
/ 3D Games - Real-time Rend…ng & Software Technology / 3D Games - Real-time Rendering & Software Technology.iso / flysdk / plugin / walk / walk.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-09-03  |  4.7 KB  |  201 lines

  1. #include "walk.h"
  2.  
  3. void mp_message(int from,mp_msg *msg);
  4. void draw_game_status();
  5.  
  6. person_desc cd_person;
  7. jump_pad_desc cd_jump_pad;
  8. birth_pad_desc cd_birth_pad;
  9. gib_desc cd_gib;
  10.  
  11. BOOL APIENTRY DllMain(HINSTANCE hModule, 
  12.                       DWORD  ul_reason_for_call, 
  13.                       LPVOID lpReserved)
  14. {    
  15.     switch( ul_reason_for_call ) 
  16.     {
  17.     case DLL_PROCESS_ATTACH:
  18.     case DLL_THREAD_ATTACH:
  19.     case DLL_THREAD_DETACH:
  20.     case DLL_PROCESS_DETACH:
  21.         break;
  22.     };
  23.     return TRUE;
  24. }
  25.  
  26. __declspec( dllexport )
  27. int num_classes()
  28. {
  29.     return 4;
  30. }
  31.  
  32. __declspec( dllexport )
  33. class_desc *get_class_desc(int i)
  34. {
  35.     switch(i)
  36.     {
  37.     case 0:
  38.         return &cd_birth_pad;
  39.     case 1:
  40.         return &cd_jump_pad;
  41.     case 2:
  42.         return &cd_gib;
  43.     case 3:
  44.         return &cd_person;
  45.     default: return 0;
  46.     }
  47. }
  48.  
  49. __declspec( dllexport )
  50. int fly_message(int msg,int param,void *data)
  51. {
  52.     switch(msg)
  53.     {
  54.     case FLYM_DRAWSCENE:
  55.         if (directx->mpmode!=FLYMP_SERVER)
  56.             {
  57.             flyengine->set_camera(flyengine->cam);
  58.             flyengine->draw_bsp();
  59.         
  60.             if (flyengine->stencil)
  61.                 {
  62.                 flyengine->start_text_mode();
  63.                 glEnable(GL_STENCIL_TEST);
  64.                 glStencilFunc(GL_NOTEQUAL,0,~0);
  65.                 glColor3fv(&flyengine->shadowcolor.x);
  66.                 glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP);
  67.                 glBlendFunc(GL_ZERO, GL_SRC_COLOR);
  68.                 glRecti(0, 0, screen_sx, screen_sy);
  69.                 glDisable(GL_STENCIL_TEST);
  70.                 }
  71.             }
  72.         break;
  73.     case FLYM_DRAWTEXT:
  74.         draw_game_status();
  75.         break;
  76.     case FLYM_MPUPDATE:
  77.         ((person *)(flyengine->player))->mp_send_pos(
  78.             FLYMP_MSG_POS,
  79.             0xf|
  80.             ((person *)(flyengine->player))->flag|
  81.             (((person *)(flyengine->player))->points<<16));
  82.         return 0;
  83.     case FLYM_MPMESSAGE:
  84.         mp_message(param,(mp_msg *)data);
  85.         return 1;
  86.     }
  87.     return 1;
  88. }
  89.  
  90. void mp_message(int from,mp_msg *msg)
  91. {    
  92.     switch( msg->type )
  93.         {
  94.         case FLYMP_MSG_POS:
  95.             {
  96.                 struct mp_data *data=(mp_data *)&msg->type;
  97.                 person *s=(person *)directx->players[from].data;
  98.                 if (from>0)
  99.                     {
  100.                     s->remove_from_bsp();
  101.                     s->pos=data->pos;
  102.                     s->vel=data->vel;
  103.                     s->walkvec=data->walkvel;
  104.                     s->ls.Y=data->Y;
  105.                     s->ls.Z=data->Z;
  106.                     s->ls.X=data->X;
  107.                     s->ls.update_mat();
  108.                     s->updownrot=data->rot;
  109.                     *((local_system *)s)=s->ls;
  110.                     s->rotate(s->updownrot,s->X);
  111.                     s->flag=data->flag&0xffff;
  112.                     s->points=(short)(data->flag>>16);
  113.                     s->add_to_bsp();
  114.                     }
  115.                 if (from>=0 && ((data->flag&0xf)!=0xf))
  116.                     if (s->g)
  117.                     {
  118.                         s->g->fire(s,s->player);
  119.                         s->cur_anim_time=flyengine->cur_time;
  120.                         s->cur_anim=2;
  121.                         s->loop_anim=0;
  122.                     }
  123.             }
  124.             break;
  125.         case FLYMP_MSG_DAMAGE:
  126.                 {
  127.                 struct mp_data_damage *data=(mp_data_damage *)&msg->type;
  128.                 person *p=(person *)directx->players[from].data;
  129.                 p->curshield-=data->value;
  130.                 p->jumpvec=data->pushvec;
  131.                 p->jumpflag=50;
  132.                 if (from==0)
  133.                     flyengine->filter.x=1.0f;
  134.                 }
  135.             break;
  136.         case FLYMP_MSG_KILL:
  137.             {
  138.                 struct mp_data_kill *data=(mp_data_kill *)&msg->type;
  139.                 person *p=(person *)directx->players[from].data;
  140.                 int i;
  141.                 for( i=0;i<directx->nplayers;i++ )
  142.                     if (directx->players[i].dpid==data->dpidpoints)
  143.                         break;
  144.                 p->die(i,data->hitpos,data->birthpad);
  145.             }
  146.             break;
  147.         case FLYMP_MSG_JOIN:
  148.             {
  149.                 player_data *data=(player_data *)&msg->type;
  150.                 person *p=(person *)flyengine->cam->clone();
  151.                 p->pos.null(); p->vel.null(); p->force.null(); 
  152.                 p->walkvec.null(); p->jumpflag=0;
  153.                 p->player=directx->add_player(data->name,data->dpid,p);
  154.                 flyengine->set_status_msg("%s HAS JOINED THE GAME",data->name);
  155.                 flyengine->activate(p,(directx->mpmode==FLYMP_SERVER));
  156.             }
  157.             break;
  158.         case FLYMP_MSG_QUIT:
  159.             {
  160.                 player_data *data=(player_data *)&msg->type;
  161.                 if (from<directx->nplayers)
  162.                     {
  163.                     flyengine->set_status_msg("%s HAS LEFT THE GAME",directx->players[from].name);
  164.                     bsp_object *obj=(bsp_object *)directx->remove_player(from);
  165.                     for( int i=from;i<directx->nplayers;i++ )
  166.                         ((person *)directx->players[i].data)->player=i;
  167.                     if (obj) obj->life=-1;
  168.                     }
  169.             }
  170.             break;
  171.         }
  172. }
  173.  
  174. void draw_game_status()
  175. {
  176.     static DWORD t=timeGetTime();
  177.     static int frame_rate=0,frame_count=0;
  178.     static char str[256];
  179.     frame_count++;
  180.     if (flyengine->cur_time-t>1000)
  181.         {
  182.         frame_rate=frame_count*1000/(flyengine->cur_time-t);
  183.         t=flyengine->cur_time;
  184.         frame_count=0;
  185.         }
  186.     if (flyengine->cur_time - flyengine->status_msg_time > 2000)
  187.         {
  188.         sprintf(str,"FPS:%i N:%i",frame_rate,flyengine->nodedrawcount);
  189.         flyengine->draw_text( screen_sx-96, 0, str );
  190.         }
  191.  
  192.     for( int i=0;i<directx->nplayers;i++)
  193.         {
  194.         sprintf(str,"%s %03i %02i",directx->players[i].name,
  195.             (int)(((person *)directx->players[i].data)->curshield*100),
  196.             ((person *)directx->players[i].data)->points);
  197.         flyengine->draw_text( 0, i*16, str );
  198.         }
  199. }
  200.  
  201.